home *** CD-ROM | disk | FTP | other *** search
/ Super PC 34 / Super PC 34 (Shareware).iso / spc / UTIL / DJGPP2 / V2 / DJTST200.ZIP / tests / libc / ansi / math / elefunt / texp2.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-01  |  6.0 KB  |  249 lines

  1. /* -*-C-*- derived from texp.c */
  2.  
  3. #include "elefunt.h"
  4.  
  5. /***********************************************************************
  6. #     program to test exp
  7. #
  8. #     data required
  9. #
  10. #        none
  11. #
  12. #     subprograms required from this package
  13. #
  14. #        machar - an environmental inquiry program providing
  15. #                 information on the floating-point arithmetic
  16. #                 system.  note that the call to machar can
  17. #                 be deleted provided the following four
  18. #                 parameters are assigned the values indicated
  19. #
  20. #                 ibeta - the radix of the floating-point system
  21. #                 it    - the number of base-ibeta digits in the
  22. #                         significand of a floating-point number
  23. #                 xmin  - the smallest non-vanishing floating-point
  24. #                         power of the radix
  25. #                 xmax  - the largest finite floating-point no.
  26. #
  27. #        ran(k) - a function subprogram returning random real
  28. #                 numbers uniformly distributed over (0,1)
  29. #
  30. #
  31. #     standard fortran subprograms required
  32. #
  33. #         abs, aint, alog, AMAX1, exp, float, sqrt
  34. #
  35. #
  36. #     latest revision - december 6, 1979
  37. #
  38. #     author - w. j. cody
  39. #              argonne national laboratory
  40. #
  41. #
  42. ***********************************************************************/
  43.  
  44. void
  45. texp2()
  46. {
  47.     int i,
  48.         ibeta,
  49.         iexp,
  50.         irnd,
  51.         it,
  52.         i1,
  53.         j,
  54.         k1,
  55.         k2,
  56.         k3,
  57.     machep,
  58.         maxexp,
  59.         minexp,
  60.         n,
  61.     negep,
  62.         ngrd;
  63.     float a,
  64.         ait,
  65.     albeta,
  66.         b,
  67.         beta,
  68.         d,
  69.         del,
  70.         eps,
  71.         epsneg,
  72.         r6,
  73.         r7,
  74.     v,
  75.         w,
  76.     x,
  77.         xl,
  78.         xmax,
  79.         xmin,
  80.         xn,
  81.     x1,
  82.     y,
  83.     z,
  84.     zz;
  85.  
  86.     machar(&ibeta, &it, &irnd, &ngrd, &machep, &negep, &iexp, &minexp,
  87.         &maxexp, &eps, &epsneg, &xmin, &xmax);
  88.     beta = (float) ibeta;
  89.     albeta = ALOG(beta);
  90.     ait = (float) it;
  91.     v = 0.0625e0L;
  92.     a = TWO;
  93.     b = ALOG(a) * 0.5e0L;
  94.     a = -b + v;
  95.     d = ALOG(0.9e0L * xmax);
  96.     n = 2000;
  97.     xn = (float) n;
  98.     i1 = 0;
  99.  
  100.     /* random argument accuracy tests */
  101.     for (j = 1; j <= 3; ++j)
  102.     {
  103.     k1 = 0;
  104.     k3 = 0;
  105.     x1 = ZERO;
  106.     r6 = ZERO;
  107.     r7 = ZERO;
  108.     del = (b - a) / xn;
  109.     xl = a;
  110.  
  111.     for (i = 1; i <= n; ++i)
  112.     {
  113.         x = del * ran(i1) + xl;
  114.  
  115.         /* purify arguments */
  116.         y = x - v;
  117.         if (y < ZERO)
  118.         x = y + v;
  119.         z = exp2(x);
  120.         zz = exp2(y);
  121.         if (j == 1)
  122.         z = z * exp2(-v);
  123.         else
  124.         {
  125.         if (ibeta != 10)
  126.             /* z = z *.0625e0L - z * 2.4453321046920570389e-3L; */
  127.             z = z * exp2(-2.8125L);
  128.         else
  129.             z = z * 6.0e-2L + z * 5.466789530794296106e-5L;
  130.         }
  131.         w = ONE;
  132.         if (zz != ZERO)
  133.         w = (z - zz) / zz;
  134.         if (w < ZERO)
  135.         k1 = k1 + 1;
  136.         if (w > ZERO)
  137.         k3 = k3 + 1;
  138.         w = ABS(w);
  139.         if (w > r6)
  140.         {
  141.         r6 = w;
  142.         x1 = x;
  143.         }
  144.         r7 = r7 + w * w;
  145.         xl = xl + del;
  146.     }
  147.  
  148.     k2 = n - k3 - k1;
  149.     r7 = sqrt(r7 / xn);
  150.  
  151.     printf("\fTEST OF exp2(X-" F7P4F ") VS exp2(X)/exp2(" F7P4F ")\n\n\n", v, v);
  152.     printf("%7d RANDOM ARGUMENTS WERE TESTED FROM THE INTERVAL\n", n);
  153.     printf("      (" F15P4E "," F15P4E ")\n\n\n", a, b);
  154.     printf(" exp2(X-V) WAS LARGER%6d TIMES,\n", k1);
  155.     printf("              AGREED%6d TIMES, AND\n", k2);
  156.     printf("         WAS SMALLER%6d TIMES.\n\n\n", k3);
  157.     printf(
  158. " THERE ARE %4d BASE %4d SIGNIFICANT DIGITS IN A FLOATING-POINT NUMBER\n\n\n",
  159.         it, ibeta);
  160.     w = -999.0e0;
  161.     if (r6 != ZERO)
  162.         w = ALOG(ABS(r6)) / albeta;
  163.     printf(" THE MAXIMUM RELATIVE ERROR OF" F15P4E " = %4d **" F7P2F "\n",
  164.         r6, ibeta, w);
  165.     printf("    OCCURRED FOR X =" F17P6E "\n", x1);
  166.     w = AMAX1(ait + w, ZERO);
  167.     printf(
  168.         " THE ESTIMATED LOSS OF BASE%4d SIGNIFICANT DIGITS IS" F7P2F "\n\n\n",
  169.         ibeta, w);
  170.     w = -999.0e0;
  171.     if (r7 != ZERO)
  172.         w = ALOG(ABS(r7)) / albeta;
  173.     printf(" THE ROOT MEAN SQUARE RELATIVE ERROR WAS" F15P4E " = %4d **" F7P2F "\n",
  174.         r7, ibeta, w);
  175.     w = AMAX1(ait + w, ZERO);
  176.     printf(
  177.         " THE ESTIMATED LOSS OF BASE%4d SIGNIFICANT DIGITS IS" F7P2F "\n\n\n",
  178.         ibeta, w);
  179.     if (j == 2)
  180.     {
  181.         a = -TWO * a;
  182.         b = TEN * a;
  183.         if (b < d)
  184.         b = d;
  185.     }
  186.     else
  187.     {
  188.         v = 45.0e0L / 16.0e0L;
  189.         a = -TEN * b;
  190.         b = 4.0e0L * xmin * ipow((float) beta, it);
  191.         b = ALOG(b);
  192.     }
  193.     }
  194.  
  195.     /* special tests */
  196.     printf("\fSPECIAL TESTS\n\n\n");
  197.     printf(" THE IDENTITY exp2(X)*exp2(-X) = 1.0  WILL BE TESTED.\n\n");
  198.     printf("       X        F(X)*F(-X) - 1\n\n");
  199.  
  200.     for (i = 1; i <= 5; ++i)
  201.     {
  202.     x = ran(i1) * beta;
  203.     y = -x;
  204.     z = exp2(x) * exp2(y) - ONE;
  205.     printf(F15P7E F15P7E "\n\n", x, z);
  206.     }
  207.  
  208.     printf("\n\n TEST OF SPECIAL ARGUMENTS\n\n\n");
  209.     x = ZERO;
  210.     y = exp2(x) - ONE;
  211.     printf(" exp2(0.0) - 1.0E0 = " F15P7E "\n\n", y);
  212.     x = AINT(ALOG(xmin));
  213.     y = exp2(x);
  214.     printf(" exp2(" F13P6E ") =" F13P6E "\n\n", x, y);
  215.     x = AINT(ALOG(xmax));
  216.     y = exp2(x);
  217.     printf(" exp2(" F13P6E ") =" F13P6E "\n\n", x, y);
  218.     x = x / TWO;
  219.     v = x / TWO;
  220.     y = exp2(x);
  221.     z = exp2(v);
  222.     z = z * z;
  223.     printf(" IF exp2(" F13P6E ") = " F13P6E " IS NOT ABOUT\n", x, y);
  224.     printf(" exp2(" F13P6E ")**2 =" F13P6E " THERE IS AN ARG RED ERROR\n", v, z);
  225.  
  226.     /* test of error returns */
  227.  
  228.     printf("\fTEST OF ERROR RETURNS\n\n\n");
  229.     x = -ONE / sqrt(xmin);
  230.     printf(" exp2 WILL BE CALLED WITH THE ARGUMENT" F15P4E "\n",x);
  231.     printf(" THIS SHOULD TRIGGER AN ERROR MESSAGE\n\n\n");
  232.     fflush(stdout);
  233.     errno = 0;
  234.     y = exp2(x);
  235.     if (errno)
  236.     perror("exp()");
  237.     printf(" exp2 RETURNED THE VALUE" F13P6E "\n\n\n\n", y);
  238.     x = -x;
  239.     printf(" exp2 WILL BE CALLED WITH THE ARGUMENT" F13P6E "\n", x);
  240.     printf(" THIS SHOULD TRIGGER AN ERROR MESSAGE\n\n\n");
  241.     fflush(stdout);
  242.     errno = 0;
  243.     y = exp2(x);
  244.     if (errno)
  245.     perror("exp()");
  246.     printf(" exp2 RETURNED THE VALUE" F13P6E "\n\n\n\n", y);
  247.     printf(" THIS CONCLUDES THE TESTS\n");
  248. }
  249.